#ifndef VENUS_SHAPES_SHAPE_H
#define VENUS_SHAPES_SHAPE_H

#include "common/venus.h"
#include "common/memory.h"

namespace venus {
// Intersection method return values
#define HIT		 1		// Ray hit Shape
#define MISS	 0		// Ray missed Shape
#define INPRIM	-1		// Ray started inside Shape

#define MAXLIGHTS	10

struct AABB;
struct Ray;
struct DifferentialGeometry;
class Shape : public ReferenceCounted {
 public:
  virtual ~Shape();
  virtual int Intersect(const Ray &ray, float *tHit,
                        DifferentialGeometry *dg) const {
    Severe("Unimplemented method Shape::Intersect called!");
    return MISS;
  }
  virtual int Intersect(const Ray &ray) const {
    Severe("Unimplemented method Shape::Intersect called!");
    return MISS;
  }
  virtual AABB Bound() const = 0;
};
}//namespace venus

#endif
